import {
    Entity,
    Column,
    ManyToOne,
    JoinColumn,
    Index,
    BeforeInsert,
    BeforeUpdate,
    PrimaryGeneratedColumn
} from 'typeorm';
import { Seller } from './seller.entity';
import { User } from './user.entity';

/**
 * 定义球杆编号的状态
 * - AVAILABLE: 可用（未分配）
 * - ASSIGNED: 已分配（给经销商，但未使用）
 * - LOCKED: 已锁定（已用于订单）
 */
export enum OrderStatus {
    /** 新建，未填报 */
    NEW = '0',
    /** 已填报，待生产 */
    FILLED = '1',
    /** 生产中 */
    IN_PRODUCTION = '2',
    /** 已交付 */
    FINISHED = '3'
}

@Entity('tb_order')
export class NumEntity {
    /**
     * 主键ID
     * @description 自增主键，用于唯一标识每个编号记录。
     */
    @PrimaryGeneratedColumn('increment', {
        comment: '主键ID，自增'
    })
    id: number;

    /**
     * 订单状态
     * @description 订单状态：new, filled, in_production, finished
     */
    @Column({
        type: 'enum',
        enum: OrderStatus,
        default: OrderStatus.NEW,
        comment: '订单状态：new, filled, in_production, finished'
    })
    @Index()
    status: OrderStatus;

    /**
     * 订单金额
     * @description 订单金额，单位为元。
     */
    @Column({
        type: 'varchar',
        length: 10,
        comment: '订单总金额，单位为元'
    })
    price: string;

    /**
     * 订单押金
     * @description 订单押金，单位为元。
     */
    @Column({
        type: 'varchar',
        length: 10,
        comment: '订单押金，单位为元'
    })
    deposit: string;

    /**
     * 客户手机号
     * @description 客户手机号，用于联系客户。
     */
    @Column({
        type: 'varchar',
        length: 11,
        comment: '客户手机号'
    })
    phone: string;

    /**
     * 客户姓名
     * @description 客户姓名，用于标识客户。
     */
    @Column({
        type: 'varchar',
        length: 10,
        comment: '客户姓名'
    })
    name: string;

    /**
     * 订单配置
     * @description 订单配置，以JSON字符串存储。
     */
    @Column({
        type: 'json',
        nullable: true,
        comment: '订单配置，以JSON字符串存储'
    })
    config: Record<string, any>;

    /**
     * 球杆编号
     * @description 球杆编号，用于标识球杆。
     */
    @Column({
        type: 'varchar',
        name: 'stick_number',
        length: 10,
        comment: '球杆编号'
    })
    stickNumber: string;

    /**
     * 关联的经销商实体
     * @description 通过 ManyToOne 关系，方便进行对象关系映射查询。
     */
    @ManyToOne(() => Seller)
    @JoinColumn({ name: 'seller_id' })
    seller: Seller;

    /**
     * 关联的用户实体
     * @description 通过 ManyToOne 关系，方便进行对象关系映射查询。
     */
    @ManyToOne(() => User, { nullable: true })
    @JoinColumn({ name: 'user_phone', referencedColumnName: 'user_phone' })
    user: User;

    /**
     * 记录创建时间
     * @description 13位时间戳（毫秒）。
     */
    @Column({
        type: 'bigint',
        comment: '记录创建时间，13位时间戳（毫秒）'
    })
    create_at: number;

    /**
     * 记录最后更新时间
     * @description 13位时间戳（毫秒）。
     */
    @Column({
        type: 'bigint',
        comment: '记录最后更新时间，13位时间戳（毫秒）'
    })
    update_at: number;

    /**
     * 在插入数据库之前，自动设置创建和更新时间。
     */
    @BeforeInsert()
    beforeInsert() {
        this.create_at = Date.now();
        this.update_at = Date.now();
    }

    /**
     * 在更新数据库之前，自动设置更新时间。
     */
    @BeforeUpdate()
    beforeUpdate() {
        this.update_at = Date.now();
    }
}
